iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
Software Development

從零開始Pandas-外加一點Matplotlib系列 第 4

Day3: 欄位異動的操作

  • 分享至 

  • xImage
  •  

昨天說到如何新增一個DataFrame,也說到每個一欄位都是一個series,接下來不能免俗的要介紹欄位的修改,這個在Pandas中最常見的操作,身為靈活的功夫熊貓,自然不會只有一個招式,條條大路通修改。
https://ithelp.ithome.com.tw/upload/images/20250917/20178631P0rKAZxDRs.jpg

首先,我們先手動新增一個DataFrame

df = pd.DataFrame({"name":["Mary","John","Cindy"], "salary":[50000,72000,89000]})

新增/修改欄位

直接賦值法

非常直接,用方括號指定欄位名稱就可以了,data可以是常數值,也可以來自另一個欄位再做運算。如果是常數值,就會整個series都是相同的值,新增跟修改是一樣的,欄位存在就覆蓋,不存在就新增。

df["annual_salary"] = df["salary"] * 14
df["department"] = "Sales Dept"
index name salary annual_salary department
0 Mary 50000 700000 Sales Dept
1 John 72000 1008000 Sales Dept
2 Cindy 89000 1246000 Sales Dept

使用assign ★★★★★

assign會返回一個新的物件,使用上會是更安全的選擇,同時它可以一次新增多個欄位,它的語法是
df.assign(欄位1 = 欄位值1, 欄位2 = 欄位值2, 欄位3 = 欄位值3....)
欄位值可以是常數,可是另一個欄位的加總,也可以是lambda語句

# 以下兩個語句 效果一樣
df2 = df.assign(annual_salary = df["salary"] *14,
               department = "Sales Dept")

df2 = df.assign(annual_salary = lambda d: d["salary"] *14,
               department = "Sales Dept")

assign同樣適用,欄位存在就覆蓋,不存在就新增

刪除欄位

刪除的部分可以用跟python一樣的用法的pop/del,也可以用df.drop

del

簡直粗暴解,沒有回頭路,

del df["department"]

pop

pop在python一樣,刪除的同時回傳欄位,可以對欄位做後續的加工處理再塞回去dataframe

annual_salary_col = df.pop("annual_salary")

drop ★★★★★

drop和assign一樣是會回傳一個新物件,是比較安全的選擇
(當然如果用原變數去接的話就是另一個故事了)
column是一個陣列,可以一次刪除多個欄位

df2 = df.drop(columns=["annual_salary","department"])

欄位重新命名: rename

欄位rename只要給columns屬性一個dictionary就可以一次修改多欄

df2 = df.rename(columns={"annual_salary":"year_salary", "department":"dept"})

但rename也不只能修改columns,它也可以修改index

index_dict = {"Mary":"Taylor", "John": "Johnny", "Cindy": "Cindy Baby"}
column_dict = {"annual_salary":"year_salary", "department":"dept"}
df2 = df.set_index('name').rename(index= index_dict, columns=column_dict)

意思是先set index為欄位name,再重設column和index

(index:name) salary year_salary dept
Taylor 50000 700000 Sales Dept
Johnny 72000 1008000 Sales Dept
Cindy Baby 89000 1246000 Sales Dept

這裡會有個小小的疑問,為什麼df可以先點set_index,再點rename。
保安!可以這樣點了又點、點了再點嗎?

可以

Method Chaining

什麼是 Method Chaining 方法鏈 ?

Method Chaining 指的是把多個 DataFrame 操作串成一條鏈,像管線 (pipeline) 一樣依序處理。在操作csv或excel,很難避免為了得到某個最終的結果,中間需要做很多加工的過程,在傳統工法中每一段加工就是一行,有了method chaining,流程能更一目了然,程式的可讀性也更高。

Before Method Chaining

df = df[df["sales"] > 100]
df["profit"] = df["sales"] - df["cost"]
df = df.groupby("dept")["profit"].mean().reset_index()

After Method Chaining

df = (
    df
    .query("sales > 100")
    .assign(profit=lambda d: d["sales"] - d["cost"])
    .groupby("dept")["profit"].mean()
    .reset_index()
)

是不是太elegant了!

https://ithelp.ithome.com.tw/upload/images/20250917/20178631HQqwOad7Rw.png

鏈很美好,但需適度服用,過猶不及,請勿為鏈而鏈

下集預告:繼續深扒DataFrame....


上一篇
Day2: 初探Data Structure
下一篇
Day4: 基於Series的操作及缺失值處理
系列文
從零開始Pandas-外加一點Matplotlib5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言